home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Mac Game Programming Gurus / TricksOfTheMacGameProgrammingGurus.iso / Book Chapters / 02 - Basic Game Graphics / Amalgam ƒ / FadeGDev.c < prev    next >
Encoding:
Text File  |  1995-03-05  |  6.2 KB  |  221 lines  |  [TEXT/MMCC]

  1. //\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/
  2. //
  3. //    FadeGDev.c
  4. //
  5. //    Code to fade a GDevice from and to black
  6. //
  7. //    History:
  8. //
  9. //    950305 jb: Compiled
  10. //
  11. //\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/
  12.  
  13.  
  14. //  __#Defines________________________________________________________________________
  15. #define kMaxPaletteSize        0xFF
  16.  
  17. //  __#Headers________________________________________________________________________
  18. #include "Utils.h"
  19. #include "FadeGDev.h"
  20.  
  21. //  __#Protos_________________________________________________________________________
  22. //  __ Macros_________________________________________________________________________
  23. //  __ Enums__________________________________________________________________________
  24. //  __ Typedefs_______________________________________________________________________
  25. typedef struct {
  26.     short    reds    [ kMaxPaletteSize ];
  27.     short    greens    [ kMaxPaletteSize ];
  28.     short    blues    [ kMaxPaletteSize ];
  29. }    FadeValues;
  30.  
  31. //  __ Static Protos__________________________________________________________________
  32. static void FadeOutDevice( short, FadeValues );
  33. static void FadeInDevice( short, FadeValues );
  34. static void BlackoutDeviceClut( void );
  35.  
  36. //  __ Extern Globals_________________________________________________________________
  37. //  __ Static Globals_________________________________________________________________
  38. static CTabHandle     pFadeClut;    // 'clut' to alter with fading functions
  39. static CTabHandle     pOrigClut;    // 'clut' to hold a copy of original
  40.  
  41. //  __ Functions______________________________________________________________________
  42.  
  43.  
  44.  
  45.  
  46.  
  47. //____ FadeWindowsGDev __________________________________________________________________________
  48. //
  49. //    Fade the GDevice a window is on. Depending on command passed, you may
  50. //    fade it from or to black
  51. //
  52. //    Returns    void
  53. //
  54. void FadeWindowsGDev( WindowPtr theWindow, short speed, etFadeCommand fadeCmd )
  55. {
  56. GDHandle            theDevice;
  57. Rect                windStructRect;
  58.  
  59.     mAssert( NULL != theWindow );
  60.     
  61.     windStructRect = mWindStructRect( theWindow );
  62.     mAssert(!EmptyRect(&windStructRect));
  63.     
  64.     // What device is this window mostly on?
  65.     theDevice = GetMaxIntersectDevice( windStructRect );
  66.     mAssert( NULL != theDevice );
  67.     
  68.     FadeGDevice( theDevice, speed, fadeCmd );
  69.  
  70. }//FadeWindowsGDev
  71.  
  72.  
  73.  
  74. //____ FadeGDevice __________________________________________________________________________
  75. //
  76. //    Fade the GDevice from or to black.
  77. //
  78. //    Returns    void
  79. //
  80. void FadeGDevice( GDHandle screen, short speed, etFadeCommand fadeCmd )
  81. {
  82. GDHandle             oldDev;
  83. FadeValues            rgbs;
  84. short                index;
  85.     
  86.     // If this device is a Direct device, it can't be faded using
  87.     // this technique.
  88.     if ( ( **screen ).gdType == directType )
  89.     {
  90.         return;
  91.     }
  92.  
  93.     oldDev = GetGDevice();
  94.     SetGDevice( screen );
  95.     
  96.     //copy screen's Color Table
  97.     pFadeClut = ( *(*screen)->gdPMap )->pmTable;
  98.     pOrigClut = ( *(*screen)->gdPMap )->pmTable;
  99.     HandToHand( ( Handle* )&pOrigClut );
  100.     
  101.     HLock( ( Handle )pFadeClut );
  102.     HLock( ( Handle )pOrigClut );
  103.  
  104.     //pre-calculate fade values
  105.     for (index = 0; index < ( *pFadeClut )->ctSize; index++)
  106.     {
  107.         rgbs.reds[index]   = (*pFadeClut)->ctTable[index].rgb.red   / speed;
  108.         rgbs.greens[index] = (*pFadeClut)->ctTable[index].rgb.green / speed;
  109.         rgbs.blues[index]  = (*pFadeClut)->ctTable[index].rgb.blue  / speed;
  110.     }
  111.  
  112.     if ( fadeCmd == eFade_FadeOutCommand )
  113.     {
  114.         FadeOutDevice( speed, rgbs );
  115.     }
  116.     else
  117.     {
  118.         FadeInDevice( speed, rgbs );
  119.     }
  120.     
  121.     //restore the clut
  122.     for ( index = 0; index < ( *pFadeClut )->ctSize; index++ )
  123.     {
  124.         (*pFadeClut)->ctTable[index].rgb.red   = ( *pOrigClut )->ctTable[index].rgb.red;
  125.         (*pFadeClut)->ctTable[index].rgb.green = ( *pOrigClut )->ctTable[index].rgb.green;
  126.         (*pFadeClut)->ctTable[index].rgb.blue  = ( *pOrigClut )->ctTable[index].rgb.blue;
  127.     }
  128.     ( *pFadeClut )->ctSeed = GetCTSeed();    //clut changed, must get new ctSeed
  129.     MakeITable( nil, nil, 0 );                //Create inverse table using GDev's default values
  130.     mAssert( noErr == QDError() );
  131.     
  132.     HUnlock( ( Handle )pFadeClut );
  133.     HUnlock( ( Handle )pOrigClut );
  134.  
  135.     SetGDevice( oldDev );
  136.     
  137.     DisposeHandle( ( Handle )pOrigClut );
  138.  
  139. }//FadeGDevice
  140.  
  141.  
  142.  
  143.  
  144. //____ FadeOutDevice __________________________________________________________________________
  145. //
  146. //    Fade out a device.
  147. //
  148. //    Returns    void
  149. //
  150. void FadeOutDevice(short speed, FadeValues rgbs)
  151. {
  152.     short     index, speedIndex;
  153.     
  154.     for ( speedIndex = speed; speedIndex >= 0; speedIndex-- )
  155.     {
  156.         for (index = 0; index < ( *pFadeClut )->ctSize; index++)
  157.         {
  158.             if ((*pFadeClut)->ctTable[index].rgb.red   > rgbs.reds[index])
  159.                 (*pFadeClut)->ctTable[index].rgb.red   -= rgbs.reds[index];
  160.             if ((*pFadeClut)->ctTable[index].rgb.green > rgbs.greens[index])
  161.                 (*pFadeClut)->ctTable[index].rgb.green -= rgbs.greens[index];
  162.             if ((*pFadeClut)->ctTable[index].rgb.blue  > rgbs.blues[index])
  163.                 (*pFadeClut)->ctTable[index].rgb.blue  -= rgbs.blues[index];
  164.         }
  165.         SetEntries( 0, ( *pFadeClut )->ctSize - 1, (*pFadeClut)->ctTable );
  166.     }
  167.     BlackoutDeviceClut();
  168. }
  169.  
  170.  
  171.  
  172.  
  173. //____ FadeWindow __________________________________________________________________________
  174. //
  175. //    Fade in a device.
  176. //
  177. //    Returns    void
  178. //
  179. void FadeInDevice( short speed, FadeValues rgbs )
  180. {
  181.     short     index, speedIndex;
  182.     
  183.     BlackoutDeviceClut();
  184.     
  185.     for (speedIndex = 0; speedIndex < speed; speedIndex++)
  186.     {
  187.         for (index = 0; index < ( *pFadeClut )->ctSize; index++)
  188.         {
  189.             if ((*pFadeClut)->ctTable[index].rgb.red   < (*pOrigClut)->ctTable[index].rgb.red)
  190.                 (*pFadeClut)->ctTable[index].rgb.red   += rgbs.reds[index];
  191.             if ((*pFadeClut)->ctTable[index].rgb.green < (*pOrigClut)->ctTable[index].rgb.green)
  192.                 (*pFadeClut)->ctTable[index].rgb.green += rgbs.greens[index];
  193.             if ((*pFadeClut)->ctTable[index].rgb.blue  < (*pOrigClut)->ctTable[index].rgb.blue)
  194.                 (*pFadeClut)->ctTable[index].rgb.blue  += rgbs.blues[index];
  195.         }
  196.         SetEntries( 0, ( *pFadeClut )->ctSize - 1, ( *pFadeClut )->ctTable );
  197.     }
  198. }
  199.  
  200.  
  201.  
  202.  
  203. //____ BlackoutDeviceClut __________________________________________________________________________
  204. //
  205. //    Black out the device.
  206. //
  207. //    Returns    
  208. //
  209. void BlackoutDeviceClut(void)
  210. {
  211.     short     index;
  212.     
  213.     for ( index = 0; index < ( *pFadeClut )->ctSize; index++ )
  214.     {
  215.         ( *pFadeClut )->ctTable[index].rgb.red   = 0;
  216.         ( *pFadeClut )->ctTable[index].rgb.green = 0;
  217.         ( *pFadeClut )->ctTable[index].rgb.blue  = 0;
  218.     }
  219.     SetEntries( 0, ( *pFadeClut )->ctSize - 1, ( *pFadeClut )->ctTable );
  220. }
  221.